#ifndef _MY_DEBUG_H_
#define _MY_DEBUG_H_ 1

#include <stdio.h>
#include <stdlib.h>

#ifndef DEFAULT_DEBUG_LEVEL	
#define DEFAULT_DEBUG_LEVEL	5
#endif


/*
 * MODULE_NAME
 *
 * LOGERROR_R(fmt, arg...)
 * LOGERROR(fmt, arg...)
 *
 * LOGDEBUG_R(fmt, arg...)
 * LOGDEBUG(fmt, arg...)
 * LOGDEBUG_LV(debug_level, fmt, arg...)
 * LOGDEBUG_R_LV(debug_level, fmt, arg...)
 *
 * LOGINFO_R(fmt, arg...)
 * LOGINFO(fmt, arg...)
 *
 * NOTE:
 * 1) The higher the debug_level, the less chance log information
 *    will be printed
 * 2) LOGDEBUG*() will disappear if MY_DEBUG is turned off
 */


#ifndef MODULE_NAME
# define _MODULE_NAME			""
#else
# define _MODULE_NAME			MODULE_NAME ":"
#endif	/* !MODULE_NAME */


/*
 * LOGERROR_R
 * LOGERROR
 */
#define LOGERROR_R(fmt, arg...)	fprintf(stderr, fmt, ##arg)
#define LOGERROR(fmt, arg...)	LOGERROR_R("[E] " _MODULE_NAME fmt, ##arg)


/*
 * LOGDEBUG_R
 * LOGDEBUG
 * LOGDEBUG_LV
 * LOGDEBUG_R_LV
 */
#ifndef MY_DEBUG

#define LOGDEBUG_R(fmt, arg...)			((void)0)
#define LOGDEBUG(fmt, arg...)			((void)0)
#define LOGDEBUG_LV(lv, fmt, arg...)	((void)0)
#define LOGDEBUG_R_LV(lv, fmt, arg...)	((void)0)

#else	/* MY_DEBUG */

#define LOGDEBUG_R(fmt, arg...)	fprintf(stderr, fmt, ##arg)
#define LOGDEBUG(fmt, arg...)	LOGDEBUG_R("[D] " _MODULE_NAME fmt, ##arg)

#define LOGDEBUG_LV(lv, fmt, arg...)	\
do {									\
	if (DEFAULT_DEBUG_LEVEL >= lv)	\
		LOGDEBUG(fmt, ##arg);			\
} while (0)

#define LOGDEBUG_R_LV(lv, fmt, arg...)	\
do {									\
	if (DEFAULT_DEBUG_LEVEL >= lv)	\
		LOGDEBUG_R(fmt, ##arg);		\
} while (0)

#endif	/* !MY_DEBUG */


/*
 * LOGINFO_R
 * LOGINFO
 */
#define LOGINFO_R(fmt, arg...)	fprintf(stderr, fmt, ##arg)
#define LOGINFO(fmt, arg...)	LOGINFO_R("[I] " _MODULE_NAME fmt, ##arg)

#endif	/* !_MY_DEBUG_H_ */
